iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
自我挑戰組

Ruby OOP to Oops !n 30系列 第 11

IT 邦鐵人賽 Day 11 - Builder

  • 分享至 

  • xImage
  •  

生成器(Builder)

目的:

從複雜物件的佈局中抽出生成程序,以便用同一個生成程序製造各種不同的物件佈局

結構:

https://ithelp.ithome.com.tw/upload/images/20220926/201510943jLlss3Mls.png

最簡單的生成器(Builder)架構,甚至不需要抽象介面,也可以完成

程式碼範例:

class CatBuilder
  def self.build
    builder = new
    yield(builder)
    builder.cat
  end

  def initialize
    @cat = Cat.new
  end

  def set_name(name)
    @cat.name = name
  end

  def set_birthday(birthday)
    @cat.birthday = Time.new(birthday)
  end


  def set_as_male
    @cat.gender = 'm'
  end

  def set_as_female
    @cat.gender = 'f'
  end

  def set_color(color)
    @cat.color = color
  end

  def cat
    @cat
  end
end

class Cat
  attr_accessor :name, :birthday, :gender, :color
  
  def characteristic
    puts "name: #{name}, birthday: #{birthday}, gender: #{gender}, color: #{color}"
  end
end

cat = CatBuilder.build do |builder|
          builder.set_name("歐魯")
          builder.set_birthday("2021-1-1")
          builder.set_as_female
          builder.set_color("玳瑁")
       end
       
cat.characteristic

結果

 name: 歐魯, birthday: 2021-01-01 00:00:00 +0800, gender: f, color: 玳瑁

抽象介面

之所以結構圖內出現的Builder,是因為因需求而創造不同的產品
例如今天如果多一個class Dog時,就會多增加一個DogBuilder來繼承Builder介面

此外還有可以增加Director來決定建立順序
https://ithelp.ithome.com.tw/upload/images/20220926/20151094v8c1PsxPcM.png

Director的功用在於協助建立流程與確保內容
例如產品建立順序為A -> B -> C
那麼這樣的流程邏輯,寫在Director
然後在建立產品時,除了一定會有A B C以外,也一定會依照順序產出

優點

  1. 可以決定成品物件的內部佈局形式:如果直接將Cat內充滿參數時會是怎樣...
    Cat.new(name:"歐魯", birthday:"2021-1-1", gender:"f", color:"玳瑁")
    這意味這每個參數都必須填入。隨著參數增加,那這整串也會越來越長...
    所以利用 生成器(Builder) 可以只加入需要的特徵即可
  2. 將生成程序與內部佈局的程式碼隔離開來:Cat實體與其特徵設定,不會混在一起
  3. 若是加入Director類別時,可以確保生成程序

明天要來開始討論Factory Method囉~ 加油加油

感謝大家 如有問題,再煩請大家指教!


上一篇
IT 邦鐵人賽 Day 10 - Abstract factory pattern
下一篇
IT 邦鐵人賽 Day 12 - Factory Method
系列文
Ruby OOP to Oops !n 3020
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Jean_HSU
iT邦新手 5 級 ‧ 2022-09-28 23:19:35

歐魯喵喵叫~~~

我要留言

立即登入留言